"""
https://leetcode.cn/problems/department-highest-salary/description/?envType=study-plan-v2&envId=30-days-of-pandas&lang=pythondata

184. 部门工资最高的员工
中等
相关标签
premium lock icon
相关企业
SQL Schema
Pandas Schema
表： Employee

+--------------+---------+
| 列名          | 类型    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
在 SQL 中，id是此表的主键。
departmentId 是 Department 表中 id 的外键（在 Pandas 中称为 join key）。
此表的每一行都表示员工的 id、姓名和工资。它还包含他们所在部门的 id。
 

表： Department

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
在 SQL 中，id 是此表的主键列。
此表的每一行都表示一个部门的 id 及其名称。
 

查找出每个部门中薪资最高的员工。
按 任意顺序 返回结果表。
查询结果格式如下例所示。

 

示例 1:

输入：
Employee 表:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Jim   | 90000  | 1            |
| 3  | Henry | 80000  | 2            |
| 4  | Sam   | 60000  | 2            |
| 5  | Max   | 90000  | 1            |
+----+-------+--------+--------------+
Department 表:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+
输出：
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
| IT         | Max      | 90000  |
+------------+----------+--------+
解释：Max 和 Jim 在 IT 部门的工资都是最高的，Henry 在销售部的工资最高。


"""

import pandas as pd

def department_highest_salary(employee: pd.DataFrame, department: pd.DataFrame) -> pd.DataFrame:
    # 分组求得最大薪水
    department_max_salary= employee.groupby('departmentId')['salary'].max().reset_index()
    # print(department_max_salary)
    # 此处筛选出符合条件的雇员
    filter_employee= pd.merge(department_max_salary,employee,on=['departmentId','salary'],how='inner')
    # print(filter_employee)
    # 进行类似left join的操作
    merge_employee=pd.merge(filter_employee,
                            department,
                            left_on='departmentId',
                            right_on='id',
                            how='left')[['name_y','name_x','salary']].rename(
                                columns={'name_x':'Employee','salary':'Salary','name_y':'Department'})
    
    return merge_employee


if __name__=='__main__':
    
    employee = pd.DataFrame([
      [1, 'Joe', 70000, 1],
      [2, 'Jim', 90000, 1],
      [3, 'Henry', 80000, 2],
      [4, 'Sam', 60000, 2],
      [5, 'Max', 90000, 1]
    ],columns=['id','name','salary','departmentId'])
    
    department = pd.DataFrame([
      [1, 'IT'],
      [2, 'Sales']
    ],columns=['id','name'])
    
    res=department_highest_salary(employee,department)
    print(res)
    
    
    pass
